// Copyright (c) 2012 NetPipe
// All Rights Reserved.
// Copyright (c) 2012 NetPipe
// All Rights Reserved.

/**
 * @file Config.h
 * 程序配置
 * @author fanpc
 * @date 2012/07/25
 * @version 1.0
 * @note Create
 * Date		     Ver	     Name	   Description
 * 20120725		 1.1.0		 fanpc	   create
 */

#ifndef NP_CONFIG_CONFIG_H
#define NP_CONFIG_CONFIG_H

#include "Structures.h"
#include "XmlConfBase.h"
#include <map>

class Config : public XmlConfBase
{
public:
  static Config* getInstance();

  void initializeConfigs();

  /**
      * 读取offon.xml值，用以结束程序
      */
  int getOffon() throw (int);

  /**
    * 取配置信息
    * @return 返回配置信息结构体指针
    */
  configInfo::ConfigInfo* getConfig(const std::string& flag);
  configInfo::ConfigInfo* getConfig();
  configInfo::ConfigInfo* getConfig(int index);

  int getSize();

  void setLastUpdate(const std::string& value, const std::string& flag);
  void saveXml(const std::string& value, const std::string& flag);

private:
  Config();
  ~Config();

  /**
    * 保护空指针
    */
  char* checkPtr(const char* ptr)
  {
    npexception::throwExIf(ptr == NULL, npexception::XML_READ_ERROR);
    return const_cast<char*>(ptr);
  }

  /**
    *  取 node 中的具体信息
    * @param node
    * @param key node 中具体信息的名字
    */
  char* getValueFromNode(const pugi::xpath_node& node, const char* key);

  void todo(const pugi::xml_document& pugixml);
  void reset();

  /**
    * 保存一个 config node 的信息
    * @param src
    * @param des
    */
  void fillNode(const pugi::xpath_node& src, configInfo::ConfigInfo& des);

private:
  typedef std::map<std::string, configInfo::ConfigInfo*> ConfigMap;
  typedef ConfigMap::iterator ConfigMapIterator;
  ConfigMap m_configs; /*<保存系统所有的配置文件信息,按照flag存>*/

  pugi::xml_document m_pugixml;
  std::string m_filePath;

};

#endif
